#ifndef BUFFER_H
#define BUFFER_H

#include <cstring>
#include <iostream>
#include <unistd.h>
#include <sys/uio.h>
#include <vector>
#include <atomic>//实现原子操作
#include <cassert>

using namespace std;

class Buffer{
public:
        Buffer(int initBuffSize);//构造函数
        ~Buffer() = default;

        size_t writableBytes() const;
        size_t readableBytes() const;//用于申明类中的成员函数为“只读”函数，即函数后面加了const之后该函数不能改变类的数据成员。
        size_t prependableBytes() const;//增加程序的可读性
        const char* peek() const;
        void ensureWritable(size_t len);
        void hasWritten(size_t len);

        void retrieve(size_t len);
        void retrieveUntil(const char* end);

        void retrieveAll();
        string retrieveAllToStr();

        const char* beginWriteConst() const;
        char* beginWrite();

        void append(const string& str);
        void append(const char* str, size_t len);
        void append(const void* data, size_t len);
        void append(const Buffer& buffer);

        ssize_t readfd(int fd, int* Errno);
        ssize_t writefd(int fd, int* Errno);

private:
        char* beginPtr();
        const char* beginPtr() const;
        void makeSpace(size_t len);


        vector<char> buffer;
        atomic<size_t> readPos;
        atomic<size_t> writePos;
};


#endif